package com.gljx.web.controller.back.activiti;

import com.gljx.constant.ActivitiKey;
import com.gljx.util.ActitiviUtil;
import com.gljx.web.Entity.Message;
import com.gljx.web.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: LiXiang
 * @Description :
 * @Date: Created in 2018/1/31 13:56
 */
public class TestController {

    //导入activiti工具
    ActitiviUtil activitiUtil = new ActitiviUtil();

    @Autowired
    private MessageService messageService;

    //1.提交
    //用户点击提交按钮时我们将流程创建出来
    public void one() {
        ///////////////////////////////         一、当前没有流程       /////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////

        //1.这里是你修改单据的代码，此处你应该有一个单据
        String danju = "YHTDF202165416531321";

        //2.将这个单据编号和你需要保存的流程变量存入map集合中
        Map<String,Object> map = new HashMap<String,Object>();

        map.put(ActivitiKey.FNUMBER,danju);//使用你自己单据的key，或者用默认的
        /*com.gljx.constant.ActivitiKey 中存入流程相关的常量，最好将流程定义的key也存入其中*/

        //3.调用方法
        String piID = activitiUtil.creatFlow(
                    ActivitiKey.demo1_KEY,  //指定要启动的流程定义
                    map                     //流程变量
        );
        //4.如果你有“提交”这个流程，那么你还要补上一步，将流程推进到提交的下一步
        Message message = activitiUtil.completeFlowByPiID(piID);
        if(message != null)
        {
            message.setMessage("车辆维修-审核 #单据号# ");//消息内容
            message.setUrl("/clwx_XiangQing?fid='123456789555'");//详细路径
            messageService.insert(message);
        }

        ///////////////////////////////        二、当前有进行的流程       ///////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////

        /*详情页获取单据是否有历史记录，放到前台，然后取回 传到提交方法中判断*/

        /*审核过程中的单据被打回调此方法*/
        Message message2 = activitiUtil.complteFlowByVariable(
                ActivitiKey.demo1_KEY,  //指定要启动的流程定义
                danju                     //流程变量
        );

        if(message2 != null)
        {
            message2.setMessage("车辆维修-审核 #单据号# ");//消息内容
            message2.setUrl("/clwx_XiangQing?fid='123456789555'");//详细路径
            messageService.insert(message2);
        }

    }


    //2.审核
    //用户点击审核按钮时的操作
    public void two() {
        //1.获取页面传来的单据ID
        String danju = "YHTDF202165416531321";

        //2.根据单据来推进指定流程

        //2.1审核有两种情况同意与不同意，不同意可能有批注
        String message = "太丑不许练车";

        //根据同意不同意判断

        //2.2使用这个方法必须保证usertask节点与其子连线key值符合要求
        Object returnMsg =
                activitiUtil
                        .auditComplteMessage(//新的方法，自定义流程不需要这个
                                ActivitiKey.FNUMBER,
                                danju,                  //单据
                                0,                 //1、0是否同意取决于你的流程图
                                message              //批注，直接把前端传过来的string塞进来
                        );

        if(returnMsg instanceof Message){
            Message resultMsg = (Message) returnMsg;
            resultMsg.setMessage("车辆维修-审核 #单据号# ");//消息内容
            resultMsg.setUrl("/clwx_XiangQing?fid='123456789555'");//详细路径
            messageService.insert(resultMsg);
        }
        else if(activitiUtil.notAssign .equals(returnMsg))
        {
            System.out.println("当前用户不是要求的经办人");
        }
        else if(activitiUtil.FINISH.equals(returnMsg))
        {
            System.out.println("此流程成功推进，并且此流程已经结束");
        }
        else if(activitiUtil.SUCCESS.equals(returnMsg))
        {
            System.out.println("此流程成功推进");
        }
        else if(activitiUtil.notTask.equals(returnMsg))
        {
            System.out.println("没有找到正在进行的相关流程");
        }

    }

    //3.反审核
    //用户点击审核按钮时的操作
    public void three() {
        //需要注意反审核按钮是位于流程之外只与权限关联的。
        //这里统一跳提交按钮处
        //同样的流程图需要符合规范

        //1.获取页面传来的单据ID
        String danju = "YHTDF202165416531321";

        ///////////////////////////////         一、当前没有流程       /////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////

        //直接修改单据状态为“保存”状态
        Message message2 = activitiUtil.getMessage(
                                    ActivitiKey.FNUMBER,
                                    danju                  //单据
                            );

        if(message2 != null)
        {
            message2.setMessage("车辆维修-审核 #单据号# ");//消息内容
            message2.setUrl("/clwx_XiangQing?fid='123456789555'");//详细路径
            messageService.insert(message2);
        }
        ///////////////////////////////        二、当前有进行的流程       ///////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////



        Object result = activitiUtil.jumpActivtiMessage(
                ActivitiKey.FNUMBER,
                danju,                  //单据
                "不同意："
        );
        if(result instanceof Message){
            Message resultMsg = (Message) result;
            resultMsg.setMessage("车辆维修-审核 #单据号# ");//消息内容
            resultMsg.setUrl("/clwx_XiangQing?fid='123456789555'");//详细路径
            messageService.insert(resultMsg);
        }else
        if(activitiUtil.SUCCESS.equals(result))
        {
            System.out.println("成功");

        }else if(activitiUtil.notActiviti.equals(result))
        {
            System.out.println("找不到流程节点");

        }else if(activitiUtil.notTask.equals(result))
        {
            System.out.println("没有找到任务");
        }
    }

    //4.查询流程状态
    //进入详情页面调用
    public void four() {
        //1.获取页面传来的单据ID
        String danju = "YHTDF202165416531321";

        //2.查询
        String result = activitiUtil.getTaskStateByUser(
                ActivitiKey.FNUMBER,
                danju                  //单据
        );
        if(activitiUtil.notTask.equals(result))
        {
            System.out.println("该单据没有对应流程");        //没有历史流程（从来没有过流程的“新单据”）
        }
        else if(activitiUtil.FINISH.equals(result))
        {
            System.out.println("流程已结束");                //只有有历史流程
        }//剩下两种是该任务进行中
        else if(activitiUtil.notAssign.equals(result))
        {
            System.out.println("经办人不匹配");               //正在进行的流程，但是经办人跟当前用户不匹配
        }
        else if(activitiUtil.ISPOWER.equals(result))
        {
            System.out.println("当前用户可以审核该单据");      /**正在进行的流程，且当前用户能够审核
                                                              * 如果是进入可提交的详情页面，这个标记表示
                                                              * 此流程进行中，即用户点击提交只需推进流程即可
                                                              */
        }
    }

}
